﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GS1.Entidad;
using System.Data;
using GS1.DataAccess;
using log4net;

namespace GS1.Datos
{
    /// <summary>
    /// Clase       : SedeDA
    /// Descripcion : Contiene la datos de Sede
    /// Autor       : Pedro Miguel Vera Rafael
    /// Fecha       : 25/01/2013
    /// Empresa     : GS1 Peru
    /// </summary>
    public class SedeDA
    {
        #region --- Variables y Constantes ---
        private static readonly ILog log = LogManager.GetLogger(typeof(SedeDA));

        // Nombre procedimiento almacenado
        private const string PROCEDIMIENTO_RFID_OBTENERSEDE = "RFID.SERVIR_sp_ObtenerSede";

        // Parametros Entrada
        private const string PARAM_COD_SEDE = "P_COD_SEDE";
        private const string PARAM_CURSOR = "O_CURSOR";
        private const string PARAM_CURSOR_COMPUTADORAS = "O_CURSOR_COMPUTADORAS";
        private const string PARAM_CURSOR_RESPONSABLES = "O_CURSOR_RESPONSABLES";

        // Parametros Salida
        private const string CODSEDE = "COD_SEDE";
        private const string NOMBRE = "NOM_SEDE";
        private const string ESTADO = "ESTADO";

        private const string COMPUTADORA_COD_PC = "COD_PC";
        private const string COMPUTADORA_IP_PC = "IP_PC";
        private const string COMPUTADORA_NOMBRE_PC = "NOMBRE_PC";
        private const string COMPUTADORA_COD_SEDE = "COD_SEDE";

        private const string RESPONSABLE_COD_RESPONSABLE = "COD_RESPONSABLE";
        private const string RESPONSABLE_NOMBRE = "NOMBRE";
        private const string RESPONSABLE_CORREO = "CORREO";
        private const string RESPONSABLE_COD_SEDE = "COD_SEDE";
        #endregion

        #region --- Metodos Propios ---
        public Sede obtenerSede(Sede sede)
        {
            Sede sedeResultado = null;

            DataSet dsSede = new DataSet();

            //if (log.IsDebugEnabled)
            //{
            //    log.Debug("obtenerSede(" + sede.codigo + ")");
            //}

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexServir))
            {
                db.NombreProcedimiento = PROCEDIMIENTO_RFID_OBTENERSEDE;
                db.agregarParametro(PARAM_COD_SEDE,DbType.Int32, ParameterDirection.Input, sede.codigo);
                db.agregarParametro(PARAM_CURSOR, DbType.Binary, ParameterDirection.Output, null);
                db.agregarParametro(PARAM_CURSOR_COMPUTADORAS, DbType.Binary, ParameterDirection.Output, null);
                db.agregarParametro(PARAM_CURSOR_RESPONSABLES, DbType.Binary, ParameterDirection.Output, null);

                IDataAdapter dataAdapter = db.obtenerDataAdapter();
                dataAdapter.Fill(dsSede);

                if (dsSede.Tables.Count > 0)
                {
                    sedeResultado = generarEntidad(dsSede.Tables[0].Rows[0]);

                    sedeResultado.listaSedeComputadora = new ListaSedeComputadora();
                    foreach (DataRow fila in dsSede.Tables[1].Rows)
                    {
                        sedeResultado.listaSedeComputadora.Add(generarEntidadComputadora(fila));
                    }

                    sedeResultado.listaSedeResponsable = new ListaSedeResponsable();
                    foreach (DataRow fila in dsSede.Tables[2].Rows)
                    {
                        sedeResultado.listaSedeResponsable.Add(generarEntidadResponsable(fila));
                    }
                }
            }

            return sedeResultado;
        }

        private Sede generarEntidad(DataRow fila)
        {
            Sede sede = new Sede();
            sede.codigo = Convert.ToInt32(fila[CODSEDE]);
            sede.descripcion = fila[NOMBRE].ToString();
            sede.estado = fila[ESTADO].ToString();
            return sede;
        }

        private SedeComputadora generarEntidadComputadora(DataRow fila)
        {
            SedeComputadora sedeComputadora = new SedeComputadora();
            sedeComputadora.codPC = Convert.ToInt32(fila[COMPUTADORA_COD_PC]);
            sedeComputadora.nombrePC = fila[COMPUTADORA_NOMBRE_PC].ToString();
            sedeComputadora.ipPC = fila[COMPUTADORA_IP_PC].ToString();

            return sedeComputadora;
        }

        private SedeResponsable generarEntidadResponsable(DataRow fila)
        {
            SedeResponsable sedeResponsable = new SedeResponsable();
            sedeResponsable.codResponsable = Convert.ToInt32(fila[RESPONSABLE_COD_RESPONSABLE]);
            sedeResponsable.nombre = fila[RESPONSABLE_NOMBRE].ToString();
            sedeResponsable.correo = fila[RESPONSABLE_CORREO].ToString();

            return sedeResponsable;
        }
        #endregion
    }
}